//
//  ScenesAudioManagerInternal.h
//  ScenesPlayer
//
//  Created by Branch on 2016/11/1.
//  Copyright © 2016年 Scenes. All rights reserved.
//

#ifndef __ScenesAudioMix_ScenesAudioManager_Internal_H__
#define __ScenesAudioMix_ScenesAudioManager_Internal_H__

#include <stdio.h>
#include <stdint.h>
#include <vector>


class VrAudioMix;
class ScenesAudioCodec;
class IAudioDecoderFactory;


//森声全景声音频解码混合器（内部类）

class ScenesAudioManagerInternal {
public:
    ScenesAudioManagerInternal();
    ~ScenesAudioManagerInternal();

    
    /**
     打开森声全景声音频解码混合器，通过输入audioDecoderFactory来实现自定义音频解码器，
     应该保留audioDecoderFactory这个实例，直到调用shutdown（）后才去销毁它

     @param audioDecoderFactory 自定义音频解码器工厂实例
     @param sampleRate 音频采样率
     @param channelsPerFrame 音频声道数
     @param bitsPerChannel 音频位宽度
     @return 成功返回true，失败返回false
     */
    bool openScenesAudioManager(IAudioDecoderFactory* audioDecoderFactory,int sampleRate,int channelsPerFrame,int bitsPerChannel);
    
    
    /**
     关闭森声全景声音频解码混合器
     */
    void shutdown();
    
    

    
    /**
     * 清理缓存,把所有未解码或已解码但未播放的数据清理
     * 一般在seekto的时候调用
     */
    void clean();
    
    
    /**
     输入未解码的音频数据

     @param buff 数据地址
     @param buffLen 数据长度
     @param sampleTimeUs 该帧数据的pts，单位：微秒
     @return 成功返回true，失败返回false
     */
    bool inputSampleData(uint8_t* buff, int buffLen, int64_t sampleTimeUs);
    
    

    
    /**
     输出已解码数据的pts，单位：微秒

     @param out_sampleTimeUs 已解码帧的pts
     @return 成功返回true，失败返回false
     */
    bool outputSampleData(int64_t* out_sampleTimeUs);
    
    
    
    
    /**
     根据当前视频播放的角度和需要获取的音频帧的pts来获取全景声音频帧

     @param in_angle 当前视频播放的角度
     @param in_sampleTimeUs 要获取的音频帧的pts
     @param out_buff 输出参数，返回读取的数据地址
     @param out_buffLen 输出参数，返回读取的数据长度
     @return 成功返回true，失败返回false
     */
    bool getMixAudioData(float in_angle,int64_t in_sampleTimeUs,
                         uint8_t** out_buff,uint32_t* out_buffLen);

    
    
    

    
    /********************************************************/
    /*****************以下都是私有接口，不应该使用****************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /********************************************************/
    /*****************以下都是私有接口，不应该使用****************/
    /********************************************************/
    
    
    void onAudioDecode(uint8_t* data,uint32_t len,int64_t presentationTimeUs,
          int streamIndex,void* userData);
    
private:
    IAudioDecoderFactory* _audioDecoderFactory;
    
    VrAudioMix* _vrAudioMix;
    
    std::vector<ScenesAudioCodec*> _scenesAudioCodecs;
    
    int _sampleRate;
    int _channelsPerFrame;
    int _bitsPerChannel;

    
};


#endif /* __ScenesAudioMix_ScenesAudioManager_Internal_H__ */



